package com.aisile.admin.service.impl;

import com.aisile.admin.mapper.AdChannelMapper;
import com.aisile.admin.service.AdChannelService;
import com.aisile.common.exception.CustomException;
import com.aisile.common.exception.CustomExceptionThrows;
import com.aisile.model.admin.dtos.ChannelDto;
import com.aisile.model.admin.pojos.AdChannel;
import com.aisile.model.common.dtos.PageResponseResult;
import com.aisile.model.common.dtos.ResponseResult;
import com.aisile.model.common.enums.AdminHttpCodeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @Auther:yry
 * @Date:2024/7/9 0009
 * @VERSON:1.0
 */
@Service
public class AdChannelServiceImpl extends ServiceImpl<AdChannelMapper, AdChannel> implements AdChannelService {

    @Override
    public ResponseResult findByPage(ChannelDto dto) {
        // 先判断（判断错 不判断对！） 有什么好处？ 没嵌套  开发原则 最多嵌套3层
        if (dto == null) {
            //return ResponseResult.errorResult(AdminHttpCodeEnum.PARAM_INVALID);
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // i = 9 / 0;
        // 分页数据的初始化  没new  就直接能用方法
        dto.checkParam();
        // 开始拼接条件  （根据频道名称 模糊查询）
        LambdaQueryWrapper<AdChannel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // isNotBlank 对非空字符串判断  isNotEmpty 带空字符串判断
        lambdaQueryWrapper.like(StringUtils.isNotBlank(dto.getName()), AdChannel::getName, dto.getName());
        // 执行分页
        IPage<AdChannel> iPage = this.page(new Page<>(dto.getPage(), dto.getSize()), lambdaQueryWrapper);
        // 这一行代码中 涉及到了几次装箱和拆箱  ((Long)iPage.getTotal()).intValue()
        ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), Integer.valueOf(iPage.getTotal() + ""));
        responseResult.setData(iPage.getRecords());
        return responseResult;
    }

    @Override
    public ResponseResult saveChannel(AdChannel adChannel) {
        // 幂等  两次相同的请求 结果是否一致 一致：幂等 不一致：不幂等
        // 安全性 请求是否可以改变服务端数据 还能改变 不安全  不能改变 安全
        // get 请求 查询  幂等且安全
        // post 请求  添加  不幂等且不安全
        // put 请求  修改  幂等缺不安全
        // delete 请求  删除  幂等且不安全
        // 关注于  接口的   幂等和数据安全
        // 针对于数据安全  使用 双重校验（前端校验一遍  后端校验一遍）
        //  保证幂等就是保证数据不重复 （1. 数据库约束  2. 先查后插 配合 数据库锁/线程锁/分布式锁）
        if (adChannel == null || adChannel.getName() == null || StringUtils.isEmpty(adChannel.getName())) {
            return ResponseResult.errorResult(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 先查询是否有相同的数据
        int i = this.count(
                Wrappers.<AdChannel>lambdaQuery().eq(
                        AdChannel::getName, adChannel.getName()
                )
        );
        if (i > 0) {
            return ResponseResult.errorResult(AdminHttpCodeEnum.DATA_EXIST);
        }
        // 可以添加数据了
        adChannel.setCreatedTime(new Date());
        this.save(adChannel);
        return ResponseResult.okResult(AdminHttpCodeEnum.SUCCESS);
    }
}
